package com.coder.rental.utils;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 统一返回结果
 */
@Data
@Accessors(chain = true)
public class Result<T> {
    private Integer code;
    private String message;
    private Boolean success;
    private T data;

    public Result() {

    }

    /**
     * 增加、删除、修改操作成功方法
     *
     * 此方法返回一个操作成功的 {@link Result} 对象。
     * 该对象包含了操作成功的状态、状态码、消息和数据。
     *
     * @param <T> 泛型参数，表示结果数据中可能包含的类型
     * @return 一个包含操作成功信息的 {@link Result<T>} 对象
     */
    public static <T> Result<T> success() {
        return new Result<T>().setSuccess(true)
                .setCode(ResultCode.SUCCESS).setMessage("操作成功");
    }

    /**
     * 创建一个表示操作成功的 Result 对象。
     *
     * 此方法用于创建一个包含成功信息的 Result 对象。它接受一个泛型参数 T，并将其设置为 Result 对象的数据部分。
     * Result 对象的其他属性将被设置为表示成功的默认值。
     *
     * @param <T>  泛型类型，表示 Result 对象中数据部分的数据类型。
     * @param data 要包含在 Result 对象中的数据。
     * @return 一个包含成功信息的 Result 对象。
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>().setSuccess(true)
                .setCode(ResultCode.SUCCESS)
                .setMessage("操作成功").setData(data);
    }

    /**
     * 创建一个表示操作失败的 Result 对象。
     *
     * @param <T> 泛型类型，表示 Result 对象中携带的数据类型。
     * @return 一个表示操作失败的 Result 对象。
     */
    public static <T> Result<T> fail() {
        return new Result<T>().setSuccess(false)
                .setCode(ResultCode.ERROR).setMessage("操作失败");
    }
}
